package model;

public abstract class MovedorMovible {

    protected boolean mover(Escenario escenario,Movible movible,int yInicial, int xIncial, int yFinal, int xFinal){
        ElemEscenario elemEscenarioInicial = getElemEscenario(escenario,yInicial, xIncial);
        ElemEscenario elemEscenarioFinal = getElemEscenario(escenario,yFinal, xFinal);
        if (validarMovimiento(elemEscenarioInicial,elemEscenarioFinal)){
            if (elemEscenarioFinal.isTransportable()){
                Transportador elemEscenarioFinal1 = (Transportador) elemEscenarioFinal;
                elemEscenarioFinal = getElemEscenario(escenario,elemEscenarioFinal1.getyTransportador(),elemEscenarioFinal1.getxTransportador());
            }
            return movible.mover(elemEscenarioFinal);
        }
        return false;
    }

    protected ElemEscenario getElemEscenario(Escenario escenario,int y,int x){
        return escenario.getPosicion(y,x);
    }

    protected boolean validarMovimiento(ElemEscenario elemEscenarioInicial,ElemEscenario elemEscenarioFinal) {
        if (elemEscenarioFinal.isMovimientoValido()) {
            int x = elemEscenarioInicial.getX();
            int y = elemEscenarioInicial.getY();
            if ((elemEscenarioFinal.getX() == x + 1 && elemEscenarioFinal.getY() == y) ||
                    (elemEscenarioFinal.getX() == x - 1 && elemEscenarioFinal.getY() == y) ||
                    (elemEscenarioFinal.getY() == y + 1 && elemEscenarioFinal.getX() == x) ||
                    (elemEscenarioFinal.getY() == y - 1 && elemEscenarioFinal.getX() == x)) {
                return true;
            }
        }

        return false;
    }

    public boolean movermovibleIzquierda(Escenario escenario,Movible movible){
        int yInicial = movible.getPosicion().getY();
        int xIncial = movible.getPosicion().getX();
        return mover(escenario,movible, yInicial, xIncial,yInicial,xIncial-1);
    }

    public boolean movermovibleDerecha(Escenario escenario,Movible movible){
        int yInicial = movible.getPosicion().getY();
        int xIncial = movible.getPosicion().getX();
        return mover(escenario,movible, yInicial, xIncial,yInicial,xIncial+1);
    }

    public boolean movermovibleArriba(Escenario escenario,Movible movible){
        int yInicial = movible.getPosicion().getY();
        int xIncial = movible.getPosicion().getX();
        return mover(escenario,movible, yInicial, xIncial,yInicial-1,xIncial);
    }

    public boolean movermovibleAbajo(Escenario escenario,Movible movible){
        int yInicial = movible.getPosicion().getY();
        int xIncial = movible.getPosicion().getX();
        return mover(escenario,movible, yInicial, xIncial,yInicial+1,xIncial);
    }

    public abstract boolean mover(Escenario escenario,Movible movible);

}
